package common

import (
	"github.com/gomodule/redigo/redis"
	"github.com/sirupsen/logrus"
	"time"
)

type RedisConfig struct {
	Host         string
	Passwd       string
	RedisMaxIdle int
	RedisMaxConn int
}

//在golang的项目中，若要频繁的用redis（或者其他类似的NoSQL）来存取数据，最好用redigo自带的池来管理连接。
//不然的话，每当要操作redis时，建立连接，用完后再关闭，会导致大量的连接处于TIME_WAIT状态（redis连接本质上就是tcp）。
func InitRedisPoll(config RedisConfig, Log *logrus.Logger) *redis.Pool {
	Log.Infof("config=%+v", config)
	c := &redis.Pool{
		MaxIdle:     config.RedisMaxIdle, //最大的空闲连接数，表示即使没有redis连接时依然可以保持N个空闲的连接，而不被清除，随时处于待命状态。
		MaxActive:   config.RedisMaxConn, //最大的激活连接数，表示同时最多有N个连接
		IdleTimeout: time.Second * 300,   //最大的空闲连接等待时间，超过此时间后，空闲连接将被关闭
		Wait:        true,                //若为true，则当连接数达到MaxActive时，使用Get()获取新的连接时将会等待，直到有连接释放连接
		Dial: func() (redis.Conn, error) {
			con, err := redis.Dial("tcp", config.Host, redis.DialPassword(config.Passwd))
			if nil != err {
				Log.Error("connect redis pool error config=[%+v]\n,", err.Error())
				return nil, err
			}
			return con, nil
		},
	}
	return c
}
